/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AdmonHorarios;

import Usuarios.conexion;
import java.util.ArrayList;
import java.util.List;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author Miguel
 */
public class AdminCalendario {
    
    //Conexion para la Base de Datos
    private EntityManagerFactory emf = conexion.getInstancia().getEMF();
    private EntityManager em = emf.createEntityManager();
    
    public ObservableList<String> obtenerPeriodos(String año, String semestre){
        ObservableList<String> Periodos = FXCollections.observableArrayList();
        //Semestre
        Query qr10 = em.createQuery("Select s.idSemestre from Semestre s "
                    + "where s.año='"+año+"-01-01"
                    + "' and s.semestre="+semestre
                    + " and s.anulado=false");
        List<Integer> idSemes =qr10.getResultList();
        
        //Consultas de todos los Periodos no anulados
        Query qr = em.createQuery("select p from Periodo p "
                + "where p.jornadaidJornada.idJornada="+idSemes.get(0)
                + " and p.anulado = false");
        List<Entidades.Periodo> periodos = qr.getResultList();
        Hora periodo;
        for (int i=0; i<periodos.size(); i++){
            periodo = new Hora();
            periodo.setNumPeriodo(periodos.get(i).getIdPeriodo());
            periodo.setHoraInicio(periodos.get(i).getHoraInicio().toString().substring(11, 16));
            periodo.setHoraFin(periodos.get(i).getHoraFin().toString().substring(11, 16));
            //Guardamos cada periodo en un arraylist global "horas"
            Periodos.add(periodo.getHoraInicio()+" - "+periodo.getHoraFin());
        }
        return Periodos;
    }
    
    public ObservableList<String> obtenerCatedraticosPorCurso(Curso curso){
        ObservableList<String> Catedraticos = FXCollections.observableArrayList();
        Query qr = em.createQuery("SELECT c.idCurso from Curso c where c.nombre = '" + curso.getNombre() + "'"
                    + " and c.anulado = false");
        List<Integer> idc = qr.getResultList();
            
        qr = em.createQuery("select cp.catedraticoidCatedratico.numeroCatedratico from Cursoposible cp "
                    + "where cp.cursoidCurso.idCurso =" + idc.get(0));
        List<Integer> idcat = qr.getResultList();
           
        for (int i=0; i<idcat.size(); i++){
                qr = em.createQuery("select c from Catedratico c where "
                        + "c.numeroCatedratico = " + idcat.get(i)  +" and c.anulado=false");
            List<Entidades.Catedratico> cat = qr.getResultList();
            Catedratico cate = new Catedratico();
            cate.setIdCatedratico(cat.get(0).getNumeroCatedratico());
            cate.setNombres(cat.get(0).getNombre());
            cate.setApellidos(cat.get(0).getApellidos());
            cate.setCreditos(cat.get(0).getCreditos());
            Catedraticos.add(cate.getGradoAcademico()+" "+cate.getNombres()+" "+cate.getApellidos());
        }
        return Catedraticos;
    }
    
    public void filtrarAulas(ArrayList<Aula> Aulas, String Edificio, Seccion seccion){
        Aulas.clear();
        Query qr = em.createQuery("select e.idEdificio from Edificio e where e.nombre='"+
                Edificio + "' and e.anulado = false");
        List<Integer> idE =qr.getResultList();
        
        Aula aula;
        int cupo = seccion.getCupo();
        qr = em.createQuery("select a.idAula from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<Integer> idA =qr.getResultList();
        Query qr1 = em.createQuery("select a.nombre from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<String> aulas1 =qr1.getResultList();
        Query qr2 = em.createQuery("select a.capacidad from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<Short> aulas2 =qr2.getResultList();
        Query qr3 = em.createQuery("select a.laboratorio from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<Boolean> aulas3 =qr3.getResultList();
        for (int i=0; i<aulas1.size(); i++){
            aula = new Aula(idA.get(i),"Central", aulas1.get(i),aulas2.get(i),aulas3.get(i));
            Aulas.add(aula);
        }
    }
    
    public ObservableList<String> obtenerAulas(String Edificio, Seccion seccion){
        ObservableList<String> Aulas = FXCollections.observableArrayList();
        Query qr = em.createQuery("select e.idEdificio from Edificio e where e.nombre='"+
                Edificio + "' and e.anulado = false");
        List<Integer> idE =qr.getResultList();
        
        Aula aula;
        int cupo = seccion.getCupo();
        qr = em.createQuery("select a.idAula from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<Integer> idA =qr.getResultList();
        Query qr1 = em.createQuery("select a.nombre from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<String> aulas1 =qr1.getResultList();
        Query qr2 = em.createQuery("select a.capacidad from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<Short> aulas2 =qr2.getResultList();
        Query qr3 = em.createQuery("select a.laboratorio from Aula a where a.edificioidEdificio.idEdificio = "
                +String.valueOf(idE.get(0))+" and a.anulado = false and a.capacidad>="+cupo);
        List<Boolean> aulas3 =qr3.getResultList();
        for (int i=0; i<aulas1.size(); i++){
            aula = new Aula(idA.get(i),"Central", aulas1.get(i),aulas2.get(i),aulas3.get(i));
            Aulas.add(aula.getNombre() + " - Capacidad:" + aula.getCapacidad());
        }
        return Aulas;
    }
    
    public ObservableList<String> obtenerEdificios(){
        ObservableList<String> Edificios = FXCollections.observableArrayList();
        Query qr = em.createQuery("select e.nombre from Edificio e where e.anulado = false");
        List<String> edi = qr.getResultList();
        for (int i=0; i<edi.size(); i++){
            Edificios.add(edi.get(i));
        }
        return Edificios;
    }
    
}
